package org.cinvestav.parser;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.cinvestav.Articulo;
import org.cinvestav.Investigador;
import org.cinvestav.util.FileUtility;

/**
 * Clase para analizar mediante expresiones regulares el perfil en texto plano
 * del investigador.
 *
 * @author Osvaldo Salinas Martínez. @contact osalinas@tamps.cinvestav.mx
 * @create 9/01/2012 12:03:00 PM
 * @version 1.0
 */
public class PerfilParser {

    String perfil = "";
    String regex_nombre_investigador = "nombre[^:]*\\W*((.+?\\b){3,4})[\\s\\n]";
    String regex_cvu_investigador = "cvu[^:]*\\W*(\\w+?)[\\s\\n]";
    String regex_rfc_investigador = "rfc[^:]*\\W*(\\w+?)[\\s\\n]";
    String regex_curp_investigador = "curp[^:]*\\W*(\\w+?)[\\s\\n]";
    String regex_no_empleado_investigador = "(n.?|no.?|n[uú]mero) de empleado\\W*([^:]*?)[\\s\\n]";
    String regex_fecha_nacimiento = "(fecha|fcha.?|f.?) de nacimiento\\W*([^:]+?)[^\\d]+[:\\n]";
    String regex_edad = "edad\\W*(\\d+)\\D";
    String regex_lugar_nacimiento = "lugar de nacimiento[^:]*\\W*((.+?\\b){3,4})[\\s\\n]";
    String regex_categoria = "categor[ií]a[^:]*\\W*((.+?){2,3})(\\b\\w+:|[\\n\\s])";
    String regex_unidad = "unidad[^:]*\\W*((.+?\\b){2,3})[\\n\\s]";
    String regex_departamento = "(departamento|depto\\.?)[^:]*\\W*((.+?\\b){3,4})\\s";
    String regex_puesto_laboral = "(puesto|posici[oó]n) laboral[^:]*\\W*((.+?\\b){2,3})\\s";
    String regex_email = "(e-?mail|correo)\\W*([^:]*?)[\\s\\n]";
    //String regex_2_1 = "(2\\.1\\.[abcdefg])\\.\\d+(.*?;)(.*?;)(.*?;)(.*?is[sb]n.*?\\.)";//Artículos originales de investigación.
    String regex_2_1 = "2\\.1\\.[abcdefg]\\.\\d+\\W*(.*?)(?=2\\.[0-9]+)";//Artículos originales de investigación.
    String regex_2_2 = "2\\.2\\.\\d+(.*?)(?=2\\.[0-9]+)";//Artículos de revisión en libros de publicados por una casa editorial reconocida o revistas de sirculación internacional.
    String regex_2_3 = "2\\.3\\.\\d+(.*?)(?=2\\.[0-9]+)";//Capítulos de investigación original en extenso en libros especializados, publicados por una casa reconocida.
    String regex_2_4 = "2\\.4\\.\\d+(.*?)(?=2\\.[0-9]+)";//Libros especializados que cubran el trabajo del investigador, publicados por una casa editorial reconocida.
    String regex_2_5 = "2\\.5\\.\\d+(.*?)(?=2\\.[0-9]+)";//Edición de libros especializados de investigación o docencia (selección, coordinación y compilación), publicados por una casa editorial reconocida.
    String regex_2_6 = "2\\.6\\.(\\d+)(.+?)(?=22\\.[7-90]{1,2})";//Publicaciones y otros productos de investigación o desarrollo que sean el resultado de tesis de maestría o doctorado, que hayan sido dirigidas por el investigador.
    String regex_2_7 = "2\\.7\\.[abcd]\\.(\\d+)(.+?)(2\\.[6-90]{1,2})";//Desarrollos tecnológicos.
    String regex_2_8 = "2\\.8\\.[abcdef]\\.(\\d+)(.+?)(2\\.[7-90]{1,2})";//Patentes otrogadas.
    String regex_2_9 = "2\\.9\\.(\\d+)(.+?)(2\\.[7-90]{1,2})";//Desarrollo de programas originales de computación con derechos de autor registrados y con usuarios múltiples.

    /**
     * Constructor de la clase que acepta como parametro el texto plano del
     * perfil.
     *
     * @param texto_perfil.- Texto plano del documento que contien/describe el
     * perfil del investigador.
     */
    public PerfilParser(String texto_perfil) {
        this.perfil = texto_perfil;
    }

    public PerfilParser() {
    }

    public PerfilParser(StringBuffer texto_perfil) {
        this.perfil = texto_perfil.toString();
    }

    public void setPerfil(String perfil) {
        this.perfil = perfil;
    }

    public void setPerfil(StringBuffer strbuf_perfil) {
        this.perfil = strbuf_perfil.toString();
    }

    public String getPerfil() {
        return perfil;
    }

    public Investigador getInvestigador() {

        // Instancia del tipo Investigador
        Investigador investigador = new Investigador();


        System.out.println("Nombre:" + getData(regex_nombre_investigador, 1));
        investigador.setNombre(getData(regex_nombre_investigador, 1));

        System.out.println("no. de cvu:" + getData(regex_cvu_investigador, 1));
        investigador.setCvu(getData(regex_cvu_investigador, 1));

        System.out.println("rfc:" + getData(regex_rfc_investigador, 1));
        investigador.setRfc(getData(regex_rfc_investigador, 1));

        System.out.println("curp:" + getData(regex_curp_investigador, 1));
        investigador.setCurp(getData(regex_curp_investigador, 1));

        System.out.println("no. empleado:" + getData(regex_no_empleado_investigador, 2));
        investigador.setNo_empleado(getData(regex_no_empleado_investigador, 2));

        System.out.println("fecha de nacimiento:" + getData(regex_fecha_nacimiento, 2));
        investigador.setFecha_nacimiento(getData(regex_fecha_nacimiento, 2));

        System.out.println("edad: " + getData(regex_edad, 1));
        investigador.setEdad(getData(regex_edad, 1));

        System.out.println("lugar de nacimiento:" + getData(regex_lugar_nacimiento, 1));
        investigador.setLugar_nacimiento(getData(regex_lugar_nacimiento, 1));

        System.out.println("categoria:" + getData(regex_categoria, 1));
        investigador.setCategoria(getData(regex_categoria, 1));

        System.out.println("unidad:" + getData(regex_unidad, 1));
        investigador.setUnidad(getData(regex_unidad, 1));

        System.out.println("departamento:" + getData(regex_departamento, 2));
        investigador.setDepartamento(getData(regex_departamento, 2));

        System.out.println("puesto:" + getData(regex_puesto_laboral, 2));
        investigador.setPuesto_labora(getData(regex_puesto_laboral, 2));

        System.out.println("email: " + getData(regex_email, 2));
        investigador.setEmail(getData(regex_email, 2));

        //System.out.println(perfil);
        //System.exit(0);
        return investigador;
    }

    private String getData(String regex, int grupo) {
        Matcher matcher = Pattern.compile(regex).matcher(perfil);
        if (matcher.find()) {
            //System.out.println(matcher.group(grupo));
            return matcher.group(grupo).trim();
        } else {
            return "";
        }
    }

    public List<Articulo> getArticulos() {

        List<Articulo> articulos = new ArrayList<Articulo>();

        Matcher matcher = Pattern.compile(regex_2_1).matcher(perfil);


        while (matcher.find()) {
            System.out.println("\nPaper:" + matcher.group(1));
            Articulo articulo = ripperPaper(matcher.group(1));
            articulo.setTipo("2.1");
            articulos.add(articulo);
        }

//        matcher = Pattern.compile(regex_2_2).matcher(perfil);
//        while (matcher.find()) {
//            System.out.println(matcher.group(1));
//            Articulo articulo = ripperPaper(matcher.group(1));
//            articulo.setTipo("2.2");
//            articulos.add(articulo);
//        }
//        
//        matcher = Pattern.compile(regex_2_3).matcher(perfil);
//        while (matcher.find()) {
//            System.err.println(matcher.group(1));
//            Articulo articulo = ripperPaper(matcher.group(1));
//            articulo.setTipo("2.3");
//            articulos.add(articulo);
//        }
//        
//        matcher = Pattern.compile(regex_2_4).matcher(perfil);
//        while (matcher.find()) {
//            System.err.println(matcher.group(1));
//            Articulo articulo = ripperPaper(matcher.group(1));
//            articulo.setTipo("2.4");
//            articulos.add(articulo);
//        }
//        
//        matcher = Pattern.compile(regex_2_5).matcher(perfil);
//        while (matcher.find()) {
//            System.err.println(matcher.group(1));
//            Articulo articulo = ripperPaper(matcher.group(1));
//            articulo.setTipo("2.5");
//            articulos.add(articulo);
//        }


        return articulos;
    }

    public Articulo ripperPaper(String paper) {

        String regex_autores = "(.+?)[\\“\\”\\\"]'*(.+)[\\”\\“\\\"]'*";
        String regex_titulo = "[\\“\\”\\\"]'*(.+)[\\”\\“\\\"]'*";
        String regex_revista = "[\\“\\”\\\"]'*(.+)[\\”\\“\\\"]'*\\W+(.*?),";
        String regex_volumen = "\\W+(v[\\..]|vol[\\..]|volumen)\\W*(.+?)\\W+";
        String regex_numero = "\\W+(no[\\..]|n[\\..]|n[uú]mero)\\W*(.+?)\\W+";
        String regex_paginas = "\\W+(pags?[\\..]?|ps?[\\..]?|p[aá]ginas?|pp\\.)\\W+(\\d+)\\W+(\\d+)";
        String regex_año = "\\W+(\\d{4})[\\.,]";
        String regex_issn = "is[sb]n\\W+(.*?)[\\.,]";

        String regex_año_issue_pp = ".* (\\w+)\\((\\w+)\\).*";


        Articulo articulo = new Articulo();

        System.out.println("-------------------------------");

        articulo.setAutores(getAutores(getDato(paper, regex_autores, 1)));

        System.out.println(getDato(paper, regex_titulo, 1));
        articulo.setTitulo(getDato(paper, regex_titulo, 1));

        System.out.println(getDato(paper, regex_revista, 2));
        articulo.setRevista(getDato(paper, regex_revista, 2));

        if (paper.matches(regex_año_issue_pp)) {
            System.out.println(getDato(paper, regex_año_issue_pp, 1));
            articulo.setVolumen(getDato(paper, regex_año_issue_pp, 1));

            System.out.println(getDato(paper, regex_año_issue_pp, 2));
            articulo.setNumero(getDato(paper, regex_año_issue_pp, 2));
        } else {

            System.out.println(getDato(paper, regex_volumen, 2));
            articulo.setVolumen(getDato(paper, regex_volumen, 2));

            System.out.println(getDato(paper, regex_numero, 2));
            articulo.setNumero(getDato(paper, regex_numero, 2));

        }

        System.out.println(getDato(paper, regex_paginas, 2));
        articulo.setPagina_down(getDato(paper, regex_paginas, 2));

        System.out.println(getDato(paper, regex_paginas, 3));
        articulo.setPagina_up(getDato(paper, regex_paginas, 3));

        System.out.println(getDato(paper, regex_año, 1));
        articulo.setAño(getDato(paper, regex_año, 1));

        System.out.println(getDato(paper, regex_issn, 1));
        articulo.setIssn(getDato(paper, regex_issn, 1));

        return articulo;
    }

    private String getDato(String texto, String regex, int grupo) {
        Matcher matcher = Pattern.compile(regex).matcher(texto);
        return ((matcher.find()) ? matcher.group(grupo).trim() : "");
    }

    public List<Investigador> getAutores(String str_autores) {

        String regex_autor = "(.*?)(, and |, |\\.|;| y |y |and | and )";
        Matcher matcher = Pattern.compile(regex_autor).matcher(str_autores);

        List<Investigador> autores = new ArrayList<Investigador>();

        while (matcher.find()) {
            Investigador investigador = new Investigador();
            System.out.println("--" + matcher.group(1));
            investigador.setSeudonimo(matcher.group(1).trim());
            autores.add(investigador);
        }
        return autores;

    }

    public static void main(String[] args) {
        // Objeto de la clase StringBuffer para pase de parametros por referencia
        // para ahorro de memoria.
        StringBuffer strbuf_perfil;

        // Recupera/extrae el texto plano del PDF que representa el perfil del investigador.
        //PDFtoText pdftotext = new PDFtoText();
        // strbuf_perfil = pdftotext.getTextPlain("/Users/cti201111/2_cvu_ivan.pdf");

        FileUtility lector = new FileUtility();
        strbuf_perfil = new StringBuffer(lector.readLines("/Users/cti201109/Desktop/reporteCINVESTAV/ivan.txt"));

        // Analizador del perfil en texo plano para recuperar la producción del investigador.
        PerfilParser parser = new PerfilParser(strbuf_perfil);

        // Obtenemos el investigador al que pertenece el perfil.
        Investigador profesor_investigador = parser.getInvestigador();

        // Obtiene los productos producidos por el investigador.
        List<Articulo> articulos = parser.getArticulos();
        
        
        
        
        System.out.println("profesor "+profesor_investigador.getApellido_materno());
        

    }
}
